package cn.bobohost.crmrbac.service.impl;

import cn.bobohost.crmrbac.dao.mapper.EmployeeMapper;
import cn.bobohost.crmrbac.exception.LoginException;
import cn.bobohost.crmrbac.pojo.po.Employee;
import cn.bobohost.crmrbac.pojo.query.EmployeeQuery;
import cn.bobohost.crmrbac.service.EmployeeService;
import cn.bobohost.crmrbac.util.UserContext;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 波波老师
 * @since 2025-05-21
 */
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {

    @Override
    public PageInfo<Employee> findEmployeeListPage(EmployeeQuery employeeQuery) {

        //-------查询条件
        //创建条件对象(必须加泛型)
        QueryWrapper<Employee> qw = new QueryWrapper();


        //1. 关键字条件（姓名和邮箱）
        String keyword = employeeQuery.getKeyword();
        //判断关键字是否有值
//        if(StringUtils.hasText(keyword)){
//            //模糊匹配姓名，自己不需要拼接百分号
//            qw.like("name",keyword);
//        }
        //使用自带的条件判断的方法，模糊匹配姓名，自己不需要拼接百分号
//        qw.like(StringUtils.hasText(keyword),"name",keyword);

        //默认直接拼条件，是and效果   (name LIKE ? AND email LIKE ?)
//        qw.like(StringUtils.hasText(keyword),"email",keyword);

        //使用or方法，是or效果   (name LIKE ? OR email LIKE ?)
//        qw.or(StringUtils.hasText(keyword)).like(StringUtils.hasText(keyword),"email",keyword);

        //将代码改成链式编程，拼接关键字条件
//        qw.like(StringUtils.hasText(keyword),"name",keyword)
//                .or(StringUtils.hasText(keyword)).like(StringUtils.hasText(keyword),"email",keyword);

        //2. 部门id条件
        Long deptId = employeeQuery.getDeptId();
        //默认and拼接，但不对：(name LIKE ? OR email LIKE ? AND dept_id = ?)
//        qw.eq(deptId!=null && deptId!=0,"dept_id",deptId);

        //嵌套条件
        //方式1：((name LIKE ? OR email LIKE ?) AND dept_id = ?)
        qw.and(StringUtils.hasText(keyword),
                //参数2：关键字的条件：(name LIKE ? OR email LIKE ?)
                qw1->qw1.like(StringUtils.hasText(keyword),"name",keyword)
                .or(StringUtils.hasText(keyword)).like(StringUtils.hasText(keyword),"email",keyword))

                //部门id and dept_id = ?
                .eq(deptId!=null && deptId!=0,"dept_id",deptId);
        ;

        //方式2：(dept_id = ? and (name LIKE ? OR email LIKE ?) )
//        qw.
//            //部门id dept_id = ?
//            eq(deptId!=null && deptId!=0,"dept_id",deptId)
//
//            //参数2：关键字的条件：(name LIKE ? OR email LIKE ?)
//            .and(StringUtils.hasText(keyword),
//                    //注意：内部是小条件对象
//                    qw1->qw1.like(StringUtils.hasText(keyword),"name",keyword)
//                            .or(StringUtils.hasText(keyword)).
//                            like(StringUtils.hasText(keyword),"email",keyword))
//           ;


        //-----分页查询
        //PageHelper的代码
        PageHelper.startPage(employeeQuery.getCurrentPage(),employeeQuery.getPageSize());

        //正常的列表查询
//        List<Employee> employeeList = baseMapper.selectList(null);
        List<Employee> employeeList = baseMapper.selectList(qw);

        //封装分页结果
//        PageInfo<Employee> pageInfo = new PageInfo<>(employeeList);
        PageInfo<Employee> pageInfo = PageInfo.of(employeeList); //of写法

        return pageInfo;
    }

    @Override
    public void login(String username, String password) {

        //逻辑：根据用户名和密码查询员工(用户)对象

        //条件
        QueryWrapper<Employee> qw =new QueryWrapper<>();
        qw.eq("username",username)
                .eq("password",password);

        //查询
        Employee employee = baseMapper.selectOne(qw);

        //判断
        if(null == employee){
            //用户或密码不存在
//            throw new RuntimeException("用户名或密码错误");
            throw new LoginException("用户名或密码错误");//抛出自定义的异常，为了让advice来捕捉
        }

        //用户名存在，将用户放入会话
        UserContext.saveEmployee(employee);

    }

    @Override
    public void logout() {
        UserContext.saveEmployee(null);
    }

    @Override
    public Employee findEmployeeByUsername(String username) {
        //条件
        QueryWrapper<Employee> qw = new QueryWrapper<>();
        qw.eq("username",username);

        //查询
        return baseMapper.selectOne(qw);
    }
}
